import numpy as np


def calculate_similarity(
    embedding1: np.ndarray, embedding2: np.ndarray, metric: str = "cosine"
) -> float:
    """
    计算两个特征向量之间的相似度

    参数:
        embedding1: 第一个特征向量
        embedding2: 第二个特征向量
        metric: 相似度度量方法，可选值: 'cosine', 'euclidean', 'euclidean_l2'

    返回:
        相似度值
    """
    if metric == "cosine":
        # 余弦相似度: 1表示完全相同，-1表示完全相反，0表示正交
        similarity = np.dot(embedding1, embedding2) / (
            np.linalg.norm(embedding1) * np.linalg.norm(embedding2)
        )
        return float(similarity)
    elif metric == "euclidean":
        # 欧氏距离: 0表示完全相同，值越大表示越不相似
        distance = np.linalg.norm(embedding1 - embedding2)
        return float(distance)
    elif metric == "euclidean_l2":
        # L2归一化后的欧氏距离
        embedding1_l2 = embedding1 / np.linalg.norm(embedding1)
        embedding2_l2 = embedding2 / np.linalg.norm(embedding2)
        distance = np.linalg.norm(embedding1_l2 - embedding2_l2)
        return float(distance)
    else:
        # 默认使用余弦相似度
        similarity = np.dot(embedding1, embedding2) / (
            np.linalg.norm(embedding1) * np.linalg.norm(embedding2)
        )
        return float(similarity)
